package chaoyue.study.generics;

import java.util.ArrayList;
import java.util.List;

/**
 * 泛型通配符
 * 即不关心具体类型，全部向上转型成上界进行处理
 * 通配符是写在参数上的，而泛型是写在返回值前的
 * 类型通配符更多的是一种声明的作用
 */
public class GenericsWildcard {
    public static void main(String[] args) {
        // 上界通配符 表示里面的元素都是目标元素的子类（用于读取）
        List<? extends Number> list1 = new ArrayList<>();
        //list1.add(1); //编译错误，不能写入

        // 超类型通配符 表示里面的元素都是目标元素的超类（用于写入或比较）
        List<? super Integer> list2 = new ArrayList<>();
        list2.add(1); // 可以写入

        // 无界通配符 表示里面的元素类型任意
        List<?> list3 = new ArrayList<>();
        // list3.add(1); //编译错误，不能写入
    }
}
